package com.able.concurrency.t5;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author abel.he
 * @data 2018/10/29 12:52
 * @describe
 * 固定容量线程池
 * FixedThreadPoll - 固定容量线程池。创建线程池的时候，容量固定
 * 构造的时候，提供线程池的最大容量
 * PC 端一般线程数量为200 服务器线程数量1000-10000
 * 线程池处理数量*(10-18) = 访问量
 *
 * ExecutorService - 线程池服务类型。所有的线程池类型都实现了这个接口
 * 实现这个接口，代表可以提供线程池能力
 * shutdown - 优雅关闭线程池。不是强行关闭线程池，回收线程池中的资源。而是不在处理新任务，将已接受的任务处理完毕后再关闭
 * Executors - Executor的工具类。 类似与Collection和Collections的关系
 * 可以简单的创建若干种线程池
 *
 * 线程池状态 执行打印线程池就可以看到状态
 * 线程池状态  1、Runninbg 运行状态  2、Shutting down 优雅关闭状态 3、Terminated 已关闭
 *
 *
 *
 */
public class Test2_FixedThreadPoll {

    public static void main(String[] args) {
        ExecutorService threadPoll = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 6; i++) {
            threadPoll.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        TimeUnit.MILLISECONDS.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName() + " - test executor");
                }
            });
        }

        System.out.println(threadPoll);

        // 线程池正在关闭过程中。 优雅关闭。 一旦进入这个状态，线程池不再接收新的任务，处理所有已接收的任务，处理完毕后，关闭线程池
        threadPoll.shutdown();
        // 是否已经关闭， 是否调用过shutdown方法
        System.out.println(threadPoll.isShutdown());
        // 是否已经结束， 相当于回收了资源。
        System.out.println(threadPoll.isTerminated());

        System.out.println(threadPoll);

        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(threadPoll.isTerminated());
        System.out.println(threadPoll.isShutdown());

        System.out.println(threadPoll);

    }

}
